package com.bzframework.network;

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 网络组件类型
 */
public interface NetworkType {

    Map<String, NetworkType> networkTypeMap = new ConcurrentHashMap<>();

    /**
     * @return 类型唯一标识
     */
    String getId();

    /**
     * @return 类型名称
     */
    default String getName() {
        return getId();
    }

    /**
     * 使用指定的ID创建一个NetworkType
     *
     * @param id ID
     * @return NetworkType
     */
    static NetworkType of(String id) {
        return lookup(id).orElse(() -> id);
    }

    /**
     * 获取所有支持的网络组件类型
     *
     * @return 所有支持的网络组件类型
     */
    static List<NetworkType> getAll() {
        return new ArrayList<>(networkTypeMap.values());
    }

    /**
     * 根据网络组件类型ID获取类型对象
     *
     * @param id ID
     * @return Optional
     */
    static Optional<NetworkType> lookup(String id) {
        return Optional.ofNullable(networkTypeMap.get(id.toUpperCase()));
    }

    static void register(Collection<NetworkType> transport) {
        transport.forEach(NetworkType::register);
    }

    static void register(NetworkType transport) {
        networkTypeMap.put(transport.getId().toUpperCase(), transport);
    }

}
